//
//  L9_CarModel.h
//  NewBleDemo
//
//  Created by cjg on 2019/11/7.
//  Copyright © 2019 cjg. All rights reserved.
//

#import "IMNewCarModel.h"

// cmd 类型
typedef NS_ENUM(NSInteger, L9_CarModelCmdType) {
    L9_CarModelCmdTypeRealTimeVariable = 1,          // 实时数据
    L9_CarModelCmdTypeRealTimeState = 2,             // 实时状态
    L9_CarModelCmdTypeRealTimeError = 3,             // 实时故障信息
    L9_CarModelCmdTypeRealTimeComplex = 4,           // 综合实时信息
    L9_CarModelCmdTypeRealTimeReserved1 = 5,         // 保留
    L9_CarModelCmdTypeRealTimeReserved2 = 6,         // 保留
    L9_CarModelCmdTypeSingleData = 7,                // 单次统计数据
    L9_CarModelCmdTypeCumulativeData = 8,            // 累计统计数据
    L9_CarModelCmdTypeStatisticsReserved1 = 9,       // 保留cmd
    L9_CarModelCmdTypeStatisticsReserved2 = 10,      // 保留cmd
    L9_CarModelCmdTypeComplexSetting = 11,           // 综合设置
    L9_CarModelCmdTypeZeroSpeedStart = 12,           // 零速启动
    L9_CarModelCmdTypeAutomaticCruise = 13,          // 自动巡航
    L9_CarModelCmdTypeSpeedUnit = 14,                // 速度单位
    L9_CarModelCmdTypeAccelerationForce = 15,        // 加速力度
    L9_CarModelCmdTypeBrakeForce = 16,               // 刹车力度
    L9_CarModelCmdTypeSetMaxSpeed = 17,              // 车速限制
    L9_CarModelCmdTypeRideModel = 18,                // 骑行模式
    L9_CarModelCmdTypeLockCar = 19,                  // 锁车
    L9_CarModelCmdTypeSettingAmbientLightSwitch = 20,// 底部氛围灯开关
    L9_CarModelCmdTypeSettingForceAdjustSmart = 21,  // 加速力度智能调节
    L9_CarModelCmdTypeSettingSpeedLimitState = 22,   // 安全限速开关状态
    L9_CarModelCmdTypeClooseCar = 23,                // 关机
    L9_CarModelCmdTypeSetLight = 24,                 // 前灯
    L9_CarModelCmdTypeCalibrationHandle = 25,        // 启动把手校准
    L9_CarModelCmdTypeHandleCalibrationResult = 26,  // 获取把手校准结果
    L9_CarModelCmdTypeCurrentReserved = 27,          // 保留
    L9_CarModelCmdTypeDownhillAssist = 30,           // 下坡辅助
    L9_CarModelCmdTypeUphillAssist = 31,             // 上坡辅助

};

// 错误代码
typedef NS_ENUM(int, L9_CarModelErrorCode) {
    L9_CarModelErrorCodeRepeatFail = -2 ,    // 重试后失败
    L9_CarModelErrorCodeTimeOut = -1 ,       // 消息超时
    L9_CarModelErrorCodeSuccess = 0,         // 无错误，且已生效
    L9_CarModelErrorCodeNotActive = 1 ,      // 无错误，指令已缓存，但暂未生效
    L9_CarModelErrorCodeRepeat = 2 ,         //重复操作，对于控制的对象为一个连续的过程（比如IMU自动校准）时可能存在此错误，表示从机已经执行了主机指令，对应的过程正在进行中
    L9_CarModelErrorCodeParamError = 3 ,     // 参数错误
    L9_CarModelErrorCodeNotSupport = 4 ,     // 目标设备不支持此操作
    L9_CarModelErrorCodeNotAllowed = 5 ,     // 当前状态不允许进行此操作
    L9_CarModelErrorCodeNotOperation = 6 ,   // 无操作权限
    L9_CarModelErrorCodeExecutionError = 7 , // 内部执行错误
};

//MARK: ================= E20平衡车 =================
//MARK: ================= E20平衡车 =================

// E20 实时数据
typedef struct{ // 54 bytes
    uint16_t voltage;                   //当前电池电压          单位 0.01V
    int16_t current;                    //当前电池输出总电流     单位 0.01A
    int16_t speed;                      //当前车速             单位 0.01km/h
    int16_t torque;                     //电机输出扭矩          单位 0.01N/m
    int16_t output_rate;                //输出矢量电压百分比     单位 0.01% 范围0～10000
    int16_t battery_output_power;       //电池输出功率        单位 1W
    int16_t motor_output_power;         //电机输出功率        单位 1W
    uint16_t reserve;                   //预留
    int16_t pitch_angle;                //当前俯仰角度        单位 0.01°
    int16_t aim_pitch_angle;            //当前目标俯仰角度    单位 0.01°
    int16_t roll_angle;                 //输当前翻滚角度        单位 0.01°
    uint16_t mileage;                   //本次里程             单位 0.01km
    uint16_t battery_percent;            //剩余电量             单位 0.01%
    uint16_t battery_percent_for_ride;   //剩余可行驶的电量       单位 0.01%
    uint16_t remainder_mileage;         //剩余里程             单位 0.01km
} __attribute__((packed)) E20_RealtimeInfoValues;

// E20 实时状态
typedef struct{ //4 bytes
    
    /*
      运行模式
     0 失能（油门刹车无效,车辆显示屏熄灭,对外表现为关机状态）
     1 使能（油门刹车有效,车辆显示屏工作,车辆可以正常使用）
     2 锁车（车轮抱死,显示屏显示锁车状态）
     3 休眠（失能并停止心跳通讯，休眠状态下发送任意指令即可唤醒）
     */
    uint8_t state_run_mode         : 2; //运行模式
    uint8_t state_motor_work       : 1; //0 电机在非工作状态  1 电机在工作状态(加速，刹车，锁车)
    uint8_t state_brake            : 1; //0 非刹车状态       1 正在刹车
    uint8_t state_charge           : 1; //0 非充电状态       1 充电状态
    uint8_t state_lamp             : 1; //0 照明灯开启状态    1 照明灯关闭状态
    uint8_t state_tail_light       : 2; //0 尾灯关闭状态      1 尾灯常亮状态   2 尾灯闪烁状态  3 尾灯呼吸状态
    uint8_t state_auto_cruise      : 1; //0 非自动巡航状态    1 自动巡航状态
    uint8_t state_reserve          : 7; //保留状态
} __attribute__((packed)) E20_StateValues;

// E20 实时故障
typedef struct{ //8 bytes
    uint16_t error_controller       : 1; //0 控制器正常            1 控制器故障
    uint16_t error_motor            : 1; //0 电机正常              1 电机故障
    uint16_t error_battery          : 1; //0 电池正常              1 电池故障
    uint16_t error_voltage          : 2; //0 电压正常              1 欠压故障     2 过压故障     3 保留
    uint16_t error_brake_handle     : 1; //0 刹车把手正常           1 刹车把手故障
    uint16_t error_throttle_handle  : 1; //0 油门把手正常           1 油门把手故障
    
    uint16_t error_hmic_RX          : 1; //0 仪表接收控制器数据正常   1 仪表接收控制器数据异常
    uint16_t error_mc_RX            : 1; //0 控制器接收仪表数据正常   1 控制器接收仪表数据异常
    uint16_t error_mos_over_temp    : 1; //0 MOS温度正常           1 MOS温度过高
    uint16_t error_motor_over_temp  : 1; //0 电机温度正常           1 电机温度过高
    uint16_t error_battery_over_temp: 1; //0 电池温度正常           1 电池温度过高
    uint16_t error_low_heartbeat_freq:1; //0 控制器接收仪表心跳包正常    1 控制器接收仪表心跳包不稳定
    uint16_t error_posture_sensor:1;     //0 陀螺仪正常      1 陀螺仪初始化异常
    uint16_t error_posture_fall_down:1;  //0 车辆姿态正常   1 车辆姿态异常
    uint16_t error_reserve          : 1; //保留
} __attribute__((packed)) E20_ErrorValues;

// E20 综合实时信息 - 包含 连续变量、实时状态、实时故障
typedef struct{ //22 bytes
    E20_RealtimeInfoValues realtime_info;  //实时数据
    E20_ErrorValues error;                 //故障信息
    E20_StateValues state;                 //实时状态
} __attribute__((packed)) E20_ExtRealTimeInfoValues;

// E20 单次统计数据 ：
typedef struct{ //5 bytes
    uint8_t count;     //记录总数
    uint32_t index;   //记录编号
    
} __attribute__((packed)) E20_RecordValue;

// E20 单次统计数据 ：
typedef struct{ //38 bytes
    uint8_t num;
    uint8_t count;
    uint8_t total;
    uint8_t len;
    uint32_t index;   //记录编号
    uint32_t date;
    uint16_t max_speed;            //最高速度         单位 0.01km/h
    uint16_t max_power;            //最大总功率       单位 W
    uint16_t max_motor_power;      //最大电机输出功率功率       单位 W
    uint8_t max_mos_temp;
    uint8_t max_motor_temp;
    uint8_t max_battery_temp;
    uint8_t max_board_temp;
    uint32_t mileage;              //里程            单位 0.01km
    uint32_t consumption;
    uint32_t recovery;
    uint32_t ride_time;            //骑行时间         单位 S
    uint32_t power_on_time;        //开机时间         单位 S
    
} __attribute__((packed)) E20_RecordValues;

// E20 累计统计数据
typedef struct{ //24 bytes
    uint32_t mileage;              //总里程          单位 0.01km
    uint32_t consumption;          //总消耗能量       单位 0.01J
    uint32_t recovery;
    uint32_t ride_time;
    uint32_t power_on_time;        //总开机时间       单位 S
    uint32_t reserve;
    
} __attribute__((packed)) E20_StatisticsValues;

//MARK: ================= L9滑板车 =================
//MARK: ================= L9滑板车 =================

// 实时数据
typedef struct{ // 18 bytes
    uint16_t voltage;                   //当前电池电压          单位 0.01V
    int16_t current;                    //当前电池输出总电流     单位 0.01A
    int16_t speed;                      //当前车速             单位 0.01km/h
    uint16_t mileage;                   //本次里程             单位 0.01km
    uint16_t remainder_mileage;         //剩余里程             单位 0.01km
    uint32_t total_mileage;             //已经行驶总里程        单位 0.01km
    uint8_t battery_percent;            //剩余电量             单位 1%
    int8_t  mos_temperature;            //控制器(MOS管)温度     单位 °C
    int8_t  motor_temperature;          //电机温度             单位 °C
    int8_t  battery_temperature;        //电池温度             单位 °C
} __attribute__((packed)) L9_RealtimeInfoValues;

// L9 实时状态
typedef struct{ //2 bytes
    
    /*
      运行模式
     0 失能（油门刹车无效,车辆显示屏熄灭,对外表现为关机状态）
     1 使能（油门刹车有效,车辆显示屏工作,车辆可以正常使用）
     2 锁车（车轮抱死,显示屏显示锁车状态）
     3 休眠（失能并停止心跳通讯，休眠状态下发送任意指令即可唤醒）
     */
    uint8_t state_run_mode         : 2; //运行模式
    uint8_t state_motor_work       : 1; //0 电机在非工作状态  1 电机在工作状态(加速，刹车，锁车)
    uint8_t state_brake            : 1; //0 非刹车状态       1 正在刹车
    uint8_t state_charge           : 1; //0 非充电状态       1 充电状态
    uint8_t state_lamp             : 1; //0 照明灯开启状态    1 照明灯关闭状态
    uint8_t state_tail_light       : 2; //0 尾灯关闭状态      1 尾灯常亮状态   2 尾灯闪烁状态  3 尾灯呼吸状态
    uint8_t state_auto_cruise      : 1; //0 非自动巡航状态    1 自动巡航状态
    uint8_t state_reserve          : 7; //保留状态
} __attribute__((packed)) L9_StateValues;

// L9 实时故障
typedef struct{ //2 bytes
    uint16_t error_controller       : 1; //0 控制器正常            1 控制器故障
    uint16_t error_motor            : 1; //0 电机正常              1 电机故障
    uint16_t error_battery          : 1; //0 电池正常              1 电池故障
    uint16_t error_voltage          : 2; //0 电压正常              1 欠压故障     2 过压故障     3 保留
    uint16_t error_brake_handle     : 1; //0 刹车把手正常           1 刹车把手故障
    uint16_t error_throttle_handle  : 1; //0 油门把手正常           1 油门把手故障
    
    uint16_t error_hmic_RX          : 1; //0 仪表接收控制器数据正常   1 仪表接收控制器数据异常
    uint16_t error_mc_RX            : 1; //0 控制器接收仪表数据正常   1 控制器接收仪表数据异常
    uint16_t error_mos_over_temp    : 1; //0 MOS温度正常           1 MOS温度过高
    uint16_t error_motor_over_temp  : 1; //0 电机温度正常           1 电机温度过高
    uint16_t error_battery_over_temp: 1; //0 电池温度正常           1 电池温度过高
    uint16_t error_low_heartbeat_freq:1; //0 控制器接收仪表心跳包正常    1 控制器接收仪表心跳包不稳定
    uint16_t error_posture_sensor:1;     //0 陀螺仪正常      1 陀螺仪初始化异常
    uint16_t error_posture_fall_down:1;  //0 车辆姿态正常   1 车辆姿态异常
    uint16_t error_reserve          : 1; //保留
} __attribute__((packed)) L9_ErrorValues;

// L9 综合实时信息 - 包含 连续变量、实时状态、实时故障
typedef struct{ //22 bytes
    L9_RealtimeInfoValues realtime_info;  //实时数据
    L9_ErrorValues error;                 //故障信息
    L9_StateValues state;                 //实时状态
} __attribute__((packed)) L9_ExtRealTimeInfoValues;


// L9 单次统计数据 ：
typedef struct{ //20 bytes
    uint8_t max_mos_temperature;   //驱动器（MOS）最高温度  单位°
    uint8_t max_motor_temperature; //电机最高温度     单位°
    uint16_t max_speed;            //最高速度         单位 0.01km/h
    uint32_t mileage;              //里程            单位 0.01km
    uint32_t ride_time;            //骑行时间         单位 S
    uint32_t power_on_time;        //开机时间         单位 S
    uint32_t total_energy;         //消耗的总能量      单位 0.01Wh
    
} __attribute__((packed)) L9_RecordValues;

// L9 累计统计数据
typedef struct{ //12 bytes
    uint32_t mileage;              //总里程          单位 0.01km
    uint32_t energy;               //总消耗能量       单位 0.01J
    uint32_t power_on_time;        //总开机时间       单位 S
    
} __attribute__((packed)) L9_StatisticsValues;

// L9 综合设置
typedef struct{ // 5 bytes
    uint8_t zero_startup     : 1; //0 非零启动         1 零速启动
    uint8_t auto_cruise      : 1; //0 禁用自动巡航     1 开启自动巡航功能
    uint8_t speed_unit       : 1; //0 km/h     1 mph
    uint8_t driver_mode      : 3; //0 经济模式     1 正常模式  2 运动模式   3 助推模式
    uint8_t lock_mode        : 1; //0 未锁车   1 锁车
    uint8_t reserve          : 1; // 保留
    uint8_t ambient_light_mode:2; //底部氛围灯 0 关闭  1 蓝色常亮  2 蓝色常亮并作为转向灯  3 作为转向灯
    uint8_t smart_acc         :  1; //智能加速力度调节   0 关闭      1 打开
    uint8_t safe_speed_limit  :  1; //安全限速开关       0 关闭      1 打开(此时不能调节到s模式)
    uint8_t downhill_assist   :  1; //下坡辅助           0 关闭  1 打开
    uint8_t uphill_assist     :  1; //上坡辅助           0 关闭  1 打开
    uint8_t reserve1          :  2; //保留
    uint8_t accelerate_force;     //加速力度  有效范围 0-100  超出范围无效
    uint8_t brake_force;          //刹车力度  有效范围 0-100  超出范围无效
    uint16_t limit_speed;         //车辆当前限速值  单位 0.01km/h
    
} __attribute__((packed)) L9_SettingParams;

// L9 骑行模式
typedef NS_ENUM(NSUInteger, L9_CarModelRideModel) {
    L9_CarModelRideModelThrifty = 0,      // 经济模式
    L9_CarModelRideModelNormal = 1 ,      // 正常模式
    L9_CarModelRideModelSport = 2 ,       // 运动模式
    L9_CarModelRideModelBooster = 3 ,     // 助推模式
};

// 运行模式
typedef NS_ENUM(NSUInteger, L9_CarModelRunModel) {
    L9_CarModelRunModelDisability = 0,  // 失能（油门刹车无效,车辆显示屏熄灭,对外表现为关机状态）
    L9_CarModelRunModelActivity = 1 ,   // 使能（油门刹车有效,车辆显示屏工作,车辆可以正常使用）
    L9_CarModelRunModelLock = 2 ,       // 锁车（车轮抱死,显示屏显示锁车状态）
    L9_CarModelRunModelSleep = 3 ,      // 休眠（失能并停止心跳通讯）
};

extern NSString * const L9_CarModelErrorCodeDomain;

@interface L9_CarModel : IMNewCarModel

@property (nonatomic , strong) NSString *mcVersion;
@property (nonatomic , strong) NSString *btVersion;

@property (nonatomic , assign) L9_RealtimeInfoValues realtimeInfoValues;       // 实时数据
@property (nonatomic , assign) L9_StateValues stateValues;                     // 实时状态
@property (nonatomic , assign) L9_ErrorValues errorValues;                     // 实时故障
@property (nonatomic , assign) L9_RecordValues singleRecordData;               // 单次统计数据
@property (nonatomic , assign) L9_StatisticsValues statisticsData;             // 累计统计数据
@property (nonatomic , assign) L9_ExtRealTimeInfoValues extRealtimeInfoValues; // 综合实时数据
@property (nonatomic , assign) L9_SettingParams settingParams;                 // 综合设置

@property (nonatomic , assign) E20_RealtimeInfoValues e20RealtimeInfoValues;       // 实时数据
@property (nonatomic , assign) E20_StateValues e20StateValues;                     // 实时状态
@property (nonatomic , assign) E20_ErrorValues e20ErrorValues;                     // 实时故障
@property (nonatomic , assign) E20_RecordValues e20SingleRecordData;               // 单次统计数据
@property (nonatomic , assign) E20_ExtRealTimeInfoValues e20ExtRealtimeInfoValues; // 综合实时数据
@property (nonatomic , assign) E20_StatisticsValues e20StatisticsData;                 // 累计统计数据

@property (nonatomic , assign) L9_CarModelRunModel runModel;   // 运行模式
@property (nonatomic , assign) BOOL lockSwitch;                // 锁车状态
@property (nonatomic , assign) BOOL zeroSpeedStart;            // 零速启动
@property (nonatomic , assign) BOOL automaticCruise;           // 自动巡航
@property (nonatomic , assign) uint8_t speedUnit;              // 速度单位
@property (nonatomic , assign) uint8_t accelerationForce;      // 加速力度
@property (nonatomic , assign) uint8_t brakeForce;             // 刹车力度
@property (nonatomic , assign) uint16_t limitSpeed;            // 最大限速
@property (nonatomic , assign) L9_CarModelRideModel rideModel; // 骑行模式
@property (nonatomic , assign) BOOL lightSwitch;               // 前灯开关
@property (nonatomic , assign) BOOL ambientLightSwitch;        // 氛围灯开关
@property (nonatomic , assign) BOOL turnLightSwitch;           // 转向灯开关
@property (nonatomic , assign) BOOL forceSmartSwitch;          // 智能加速力度调节开关
@property (nonatomic , assign) BOOL speedLimitSwitch;          // 安全限速开关
@property (nonatomic , assign) BOOL downhillAssistSwitch;      // 下坡辅助开关
@property (nonatomic , assign) BOOL uphillAssistSwitch;        // 上坡辅助开关
@property (nonatomic , assign) uint8_t accelerationHandle;     // 油门把手校准结果
@property (nonatomic , assign) uint8_t brakeHandle;            // 刹车把手校准结果

// 读无参数
- (void)getDataWithCmdType:(L9_CarModelCmdType)cmdType isRepeat:(BOOL)isRepeat compleBlock:(IMNewCarModelCompletionBlock)compleBlock;
// 读带参数
- (void)getDataWithCmdType:(L9_CarModelCmdType)cmdType dataParam:(uint8_t)param isRepeat:(BOOL)isRepeat compleBlock:(IMNewCarModelCompletionBlock)compleBlock;
- (void)getDataWithCmdType:(L9_CarModelCmdType)cmdType data16Param:(uint16_t)param isRepeat:(BOOL)isRepeat compleBlock:(IMNewCarModelCompletionBlock)compleBlock;

// 写入 参数 uint8_t
- (void)writeDataWithCmdType:(L9_CarModelCmdType)cmdType uint8Param:(uint8_t)param successBlock:(IMNewCarModelSettingSuccessBlock)success failBlock:(IMNewCarModelSettingFailBlock)fail;
// 写入 参数 uint16_t
- (void)writeDataWithCmdType:(L9_CarModelCmdType)cmdType uint16Param:(uint16_t)param successBlock:(IMNewCarModelSettingSuccessBlock)success failBlock:(IMNewCarModelSettingFailBlock)fail;
// 写入 参数 data
- (void)writeDataWithL9CmdType:(L9_CarModelCmdType)cmdType dataParam:(NSData *)param successBlock:(IMNewCarModelSettingSuccessBlock)success failBlock:(IMNewCarModelSettingFailBlock)fail;

// 获取车辆错误代码的提示语
- (NSString *)getCarRealTimeErrorTipWithError:(L9_ErrorValues)errors ;
// 保存车辆密码
- (void)saveCarBlePassword;
// 获取车辆里的蓝牙密码
- (void)loadLocalCarBlePassword;

#pragma mark ==== 标准组
- (void)getCarVersionSuccessBlock:(IMNewCarModelSettingSuccessBlock)success failBlock:(IMNewCarModelSettingFailBlock)fail;
- (void)getCarhwVersionSuccessBlock:(IMNewCarModelSettingSuccessBlock)success failBlock:(IMNewCarModelSettingFailBlock)fail;

@end

